
// 1. Reflect.get ( target,  key,  [,receiver] )
// 该方法用于查找或者获取对象的属性，类似于【target[key]或target.key】；
// 该方法接收三个参数：
// target：获取的目标对象；
// key：目标对象的属性名；
// const obj = {
//     a:'zs',
//     age:222
// }

// let newObj = {
//     name:'ll',
//     age:20
// }
// console.log(Reflect.get(obj,'age'));
// console.log(Reflect.get(obj, "age", newObj));

// 2. Reflect.set ( target, key, value, [,receiver] )
// 该方法用于给目标对象添加属性，类似于【target.key = value 或 targe["key"] = value】；
// 该方法接收四个参数：
// target：添加属性的目标对象；
// key：添加的属性名；
// value：添加的属性值；
// receiver：可选参数，如果有setter，则receiver为setter调用时的this值；
// 该方法返回一个布尔值，表明属性添加是否成功； 
// let obj = {};
// let res = Reflect.set(obj,'name',12);
// console.log(obj,res);
// let arr = [11,222];

// let res3 = Reflect.set(arr, "length", 1);

// 3. Reflect.has()
// （1）语法

// Reflect.has ( target, key ) 

// 该方法用于判断target对象中是否具有key属性， 类似于【key in target】操作；

// 该方法接收两个参数：

// target：检查的目标对象；若传入的target非对象，则报错；
// key：检查的key属性；
// 该方法返回一个布尔值，表示对象中是否包含该属性；

// let obj = {
//     name:'zyl'
// }

// console.log(Reflect.has(obj,'name'));

// 4. Reflect.deleteProperty()
//  Reflect.deleteProperty ( target, key )

// 该方法用于删除目标对象中的属性，类似于【delete target.key】操作；

// 该方法接收两个参数：

// target：要删除属性的目标对象；
// key：要删除的目标属性；
// 该方法返回一个布尔值，表示删除是否成功；

// let obj = {
//     name:'zyl',
//     phone:'111111111'
// }
// Reflect.deleteProperty(obj,'name');
//   console.log(obj);

// 5. Reflect.construct()
// Reflect.construct ( target, args [, newTarget ] )

// 该方法用于创建一个对象实例，类似于【new Function】实例化操作；

// 该方法接收三个参数：

// target：用于创建实例对象的目标构造函数；
// args：传递给构造函数的参数列表，以数组的形式；
// newTarget：可选参数；指定新创建对象的构造函数；
// 该方法返回一份实例对象（以target为构造函数，以args为初始化参数；若newTarget存在，则以newTarget为构造函数）； 

// function Person(name, age) {
//     this.name = name;
//     this.age = age;
// }
// let p1 = Reflect.construct(Person, ['ace', 20]);

// 6. Reflect.getPrototypeOf()
// Reflect.getPrototypeOf ( target )

// 该方法用于获取目标对象的原型（__proto__），类似于【Object.getPrototypeOf(target)】；

// 该方法接收一个参数：

// target：要获取原型的目标对象；如果该参数不是对象，则会抛出一个异常；
// 该方法返回目标对象的原型；


// function Person(name, age) {
//     this.name = name;
//     this.age = age;
//   }
//   let p1 = Reflect.construct(Person, ["zyl", 18]);

//   console.log(Reflect.getPrototypeOf(p1) === Person.prototype); // true

// 7. Reflect.setPrototypeOf() 

// Reflect.setPrototypeOf(target, newProto) 

// 该方法用于设置目标对象的原型（__proto__） ，对应【Object.setPrototypeOf(target, newProto)】；

// 该方法接收两个参数：

// target：设置原型的目标对象；
// newProto：对象的新原型（一个对象或null）；
// 该方法返回一个Boolean值，表示给目标对象设置原型是否成功；


// function Person(name, age) {
//     this.name = name;
//     this.age = age;
//   }
   
//   function NewPerson(name, age) {
//     this.name = name;
//     this.age = age;
//   }
  
//   let p1 = Reflect.construct(Person, ["zyl", 18]);
// console.log(p1,'p1');
// console.log(Reflect.setPrototypeOf(p1, NewPerson)); // true

// 8. Reflect.defineProperty()

// Reflect.defineProperty(target, key, attributes)

// 该方法用于给目标对象定义或修改属性描述符，类似于【Object.defineProperty()】；

// 该方法接收三个参数：
// target：修改或添加属性的目标对象；
// key：修改或添加的属性名；
// attributes：要定义或修改的属性的描述；
// 该方法返回一个Boolean值，表示定义或修改是否成功；
// configurable: true: 该属性可以被删除，且可以修改属性的特性（如可写性、可枚举性等）。
// writable: true: 该属性的值可以被修改。
// enumerable: true: 该属性在对象的可枚举属性中可见（例如在 for...in 循环中会被列出）。
let obj = {};
// 单个添加
// Reflect.defineProperty(obj,'name', {
//     value: 'zs',
//     configurable: true,
//     writable: true,
//     enumerable: true,})
// 多个添加
Object.defineProperties(obj, {
    name: {
        value: 'zs',
        configurable: true,
        writable: true,
        enumerable: true,
    },
    age: {
        value: 18,
        configurable: true,
        writable: true,
        enumerable: true,
    },
    gender: {
        value: 'male',
        configurable: true,
        writable: true,
        enumerable: true,
    }
});
console.log(Reflect.has(obj,'gender'));
